lexer grammar XMLLexer;

options {
  language = Java;
}


@lexer::header{
  package ejercicio4;
  import java.util.ArrayList;
}

@lexer::members {

      //Lista que guarda los errores que se van produciendo durante el analisis lexico
    List<RecognitionException> errors = new ArrayList<RecognitionException>();

    //Metodo que devuelve la lista de errores que se han producido
    public List<RecognitionException> getAllErrors() {
        return errors;
    }
    
    //Metodo que comprueba si se han producido errores
    public boolean hasErrors() {
        return !errors.isEmpty();
    }

    //Metodo del analizador lexico sobrescrito para que los errores que se van
    //produciendo durante el analisis lexico en vez de mostrarse por consola
    //se guarden en la lista de errores (errors)
    @Override
    public void reportError(RecognitionException e) {
        errors.add(e);
    }
    
  
}

// Elementos de los Tags del XML
fragment BIBLIOTECA : 'biblioteca';
fragment AUTOR : 'autor';
fragment LIBRO : 'libro';
fragment EDITORIAL : 'editorial';
fragment TITULO : 'titulo';
fragment INICIO_COMENTARIO : '<!--';
fragment FIN_COMENTARIO : '-->';
fragment IGUAL: '=';
fragment MENOR : '<';
fragment MAYOR : '>';
fragment CIERRE_TAG : '</';
fragment COMILLAS : '"';

BLANCO : (' '|'\t'|'\r'?'\n') {$channel=HIDDEN;};
fragment DIGITO : '0'..'9';
NUMERO : (DIGITO)+('.'(DIGITO)+)?;

fragment LETRA: ('A'..'Z')|('a'..'z');
IDENT : (LETRA)((DIGITO)|(LETRA))*;

COMENTARIO_XML :  INICIO_COMENTARIO (options {greedy=false;}:.)* FIN_COMENTARIO {$channel=HIDDEN;};
CADENA : (LETRA | NUMERO | ' '|'\\' | '.')+;


INICIO_BIBLIOTECA : MENOR BIBLIOTECA MAYOR;
FIN_BIBLIOTECA : CIERRE_TAG BIBLIOTECA MAYOR;

INICIO_LIBRO : MENOR LIBRO MAYOR;
FIN_LIBRO : CIERRE_TAG LIBRO MAYOR;


INICIO_TITULO : MENOR TITULO MAYOR;
FIN_TITULO : CIERRE_TAG TITULO MAYOR;

INICIO_AUTOR : MENOR AUTOR MAYOR;
FIN_AUTOR : CIERRE_TAG AUTOR MAYOR;

INICIO_EDITORIAL : MENOR EDITORIAL MAYOR;
FIN_EDITORIAL : CIERRE_TAG EDITORIAL MAYOR;
